# _*_ coding: UTF-8 _*_
# @Time     : 2021/11/2 16:18
# @Author   : yangshuaishuai
# @Site     : http://www.hzdledu.cn/
# @File     : w3s3_等待机制.py
# @Software : PyCharm


from selenium import webdriver
import time


# 等待机制
# 为了同步页面加载和自动化操作，需要在操作动作之前加入等待
# 打开页面之后，页面刷新，菜单弹出

# 等待机制有3种：
# 1.强制等待
# 2.隐式等待
# 3.显示等待
#可以混合使用三种等待方式：1和3,1和2，不要2和3混合

# 1.强制等待
# time.sleep(时间）强制线程休眠一段时间
# 等待时间不可调整，一般用于演示以及调试代码
def foo1():
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('http://news.baidu.com/')
    time.sleep(1)  # 强制等待1秒

    driver.quit()


# 2.隐式等待
# 等待页面的所有元素加载完成，不会等待页面部分刷新以及菜单弹出
# 只用设置一次，在driver生命周期都有效，等待时间是弹性时间，是最大等待时长
def foo2():
    driver = webdriver.Chrome()
    # 设置隐式等待
    # implicitly_wait(second):second最大等待秒时间
    driver.implicitly_wait(30)

    driver.maximize_window()

    driver.get('https://www.jd.com/')
    driver.find_element_by_id('key').send_keys('毛衣')
    driver.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()  # 点击搜索

    time.sleep(2)
    driver.find_element_by_xpath('//*[@id="J_filter"]/div[1]/div[1]/a[2]').click()  # 点击销量

    time.sleep(2)
    for i in range(1, 6):
        driver.find_element_by_xpath(f'//*[@id="J_goodsList"]/ul/li[{i}]/div/div[1]').click()


from selenium.webdriver.support.wait import WebDriverWait#等待类
from selenium.webdriver.support import expected_conditions#等待条件
from selenium.webdriver.common.by import By#定位符

# 3.显示等待
#设置一个最大等待时间，每0.5秒检查一次等待条件是否成立
#在具体的操作之前添加响应等待语句
def foo3():
    driver = webdriver.Chrome()
    driver.maximize_window()
    #生成等待类对象，设置最大等待时间
    wait=WebDriverWait(driver,30)

    driver.get('https://www.jd.com/')
    #等待搜索输入框
    wait.until(expected_conditions.presence_of_element_located((By.ID,'key')))
    driver.find_element(By.ID,'key').send_keys('毛衣')

    wait.until(expected_conditions.presence_of_element_located((By.XPATH,'//*[@id="search"]/div/div[2]/button')))
    driver.find_element(By.XPATH,'//*[@id="search"]/div/div[2]/button').click()  # 点击搜索

    wait.until(expected_conditions.presence_of_element_located((By.XPATH,'//*[@id="J_filter"]/div[1]/div[1]/a[2]')))
    driver.find_element(By.XPATH,'//*[@id="J_filter"]/div[1]/div[1]/a[2]').click()  # 点击销量

    time.sleep(2)
    for i in range(1, 6):
        wait.until(expected_conditions.presence_of_element_located((By.XPATH,f'//*[@id="J_goodsList"]/ul/li[{i}]/div/div[1]')))
        driver.find_element(By.XPATH,f'//*[@id="J_goodsList"]/ul/li[{i}]/div/div[1]').click()

    driver.quit()

if __name__ == '__main__':
    # foo1()
    foo2()